{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import ember\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import altair as alt\n",
    "import lightgbm as lgb\n",
    "import matplotlib.pylab as plt\n",
    "from sklearn.metrics import roc_auc_score, roc_curve\n",
    "_ = alt.renderers.enable('notebook')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "data_dir = \"/data/ember2018/\" # change this to where you unzipped the download"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Vectorizing training set\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 800000/800000 [08:23<00:00, 1589.95it/s]\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Vectorizing test set\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████| 200000/200000 [02:03<00:00, 1616.06it/s]\n"
     ]
    }
   ],
   "source": [
    "ember.create_vectorized_features(data_dir)\n",
    "_ = ember.create_metadata(data_dir)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "emberdf = ember.read_metadata(data_dir)\n",
    "X_train, y_train, X_test, y_test = ember.read_vectorized_features(data_dir)\n",
    "lgbm_model = lgb.Booster(model_file=os.path.join(data_dir, \"ember_model_2018.txt\"))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "var spec = {\"config\": {\"view\": {\"width\": 400, \"height\": 300}, \"mark\": {\"tooltip\": null}}, \"data\": {\"name\": \"data-7e13dd54bc8a1e4dcd9e783efd3ade07\"}, \"mark\": \"bar\", \"encoding\": {\"color\": {\"type\": \"nominal\", \"field\": \"label\", \"legend\": {\"values\": [\"unlabeled\", \"benign\", \"malicious\"]}, \"scale\": {\"range\": [\"#00b300\", \"#3333ff\", \"#ff3333\"]}}, \"x\": {\"type\": \"ordinal\", \"axis\": {\"title\": \"Subset\"}, \"field\": \"subset\"}, \"y\": {\"type\": \"quantitative\", \"aggregate\": \"sum\", \"axis\": {\"title\": \"Number of samples\"}, \"field\": \"sha256\"}}, \"$schema\": \"https://vega.github.io/schema/vega-lite/v3.3.0.json\", \"datasets\": {\"data-7e13dd54bc8a1e4dcd9e783efd3ade07\": [{\"label\": -1, \"subset\": \"train\", \"sha256\": 200000, \"appeared\": 200000, \"avclass\": 96433}, {\"label\": 0, \"subset\": \"test\", \"sha256\": 100000, \"appeared\": 100000, \"avclass\": 0}, {\"label\": 0, \"subset\": \"train\", \"sha256\": 300000, \"appeared\": 300000, \"avclass\": 0}, {\"label\": 1, \"subset\": \"test\", \"sha256\": 100000, \"appeared\": 100000, \"avclass\": 99321}, {\"label\": 1, \"subset\": \"train\", \"sha256\": 300000, \"appeared\": 300000, \"avclass\": 289246}]}};\n",
       "var opt = {};\n",
       "var type = \"vega-lite\";\n",
       "var id = \"ecacf93a-8b24-40bc-a5c0-16f596001c47\";\n",
       "\n",
       "var output_area = this;\n",
       "\n",
       "require([\"nbextensions/jupyter-vega/index\"], function(vega) {\n",
       "  var target = document.createElement(\"div\");\n",
       "  target.id = id;\n",
       "  target.className = \"vega-embed\";\n",
       "\n",
       "  var style = document.createElement(\"style\");\n",
       "  style.textContent = [\n",
       "    \".vega-embed .error p {\",\n",
       "    \"  color: firebrick;\",\n",
       "    \"  font-size: 14px;\",\n",
       "    \"}\",\n",
       "  ].join(\"\\\\n\");\n",
       "\n",
       "  // element is a jQuery wrapped DOM element inside the output area\n",
       "  // see http://ipython.readthedocs.io/en/stable/api/generated/\\\n",
       "  // IPython.display.html#IPython.display.Javascript.__init__\n",
       "  element[0].appendChild(target);\n",
       "  element[0].appendChild(style);\n",
       "\n",
       "  vega.render(\"#\" + id, spec, type, opt, output_area);\n",
       "}, function (err) {\n",
       "  if (err.requireType !== \"scripterror\") {\n",
       "    throw(err);\n",
       "  }\n",
       "});\n"
      ],
      "text/plain": [
       "<vega.vegalite.VegaLite at 0x7f6dcfadf4a8>"
      ]
     },
     "metadata": {
      "jupyter-vega": "#ecacf93a-8b24-40bc-a5c0-16f596001c47"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": []
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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"
     },
     "metadata": {
      "jupyter-vega": "#ecacf93a-8b24-40bc-a5c0-16f596001c47"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plotdf = emberdf.copy()\n",
    "gbdf = plotdf.groupby([\"label\", \"subset\"]).count().reset_index()\n",
    "alt.Chart(gbdf).mark_bar().encode(\n",
    "    alt.X('subset:O', axis=alt.Axis(title='Subset')),\n",
    "    alt.Y('sum(sha256):Q', axis=alt.Axis(title='Number of samples')),\n",
    "    alt.Color('label:N', scale=alt.Scale(range=[\"#00b300\", \"#3333ff\", \"#ff3333\"]), legend=alt.Legend(values=[\"unlabeled\", \"benign\", \"malicious\"]))\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "var spec = {\"config\": {\"view\": {\"width\": 400, \"height\": 300}, \"mark\": {\"tooltip\": null}}, \"data\": {\"name\": \"data-58528f5c24b12afa02602281cb716a74\"}, \"mark\": \"bar\", \"encoding\": {\"color\": {\"type\": \"nominal\", \"field\": \"label\", \"legend\": {\"values\": [\"unlabeled\", \"benign\", \"malicious\"]}, \"scale\": {\"range\": [\"#00b300\", \"#3333ff\", \"#ff3333\"]}}, \"x\": {\"type\": \"ordinal\", \"axis\": {\"title\": \"Month appeared\"}, \"field\": \"appeared\"}, \"y\": {\"type\": \"quantitative\", \"aggregate\": \"sum\", \"axis\": {\"title\": \"Number of samples\"}, \"field\": \"sha256\"}}, \"$schema\": \"https://vega.github.io/schema/vega-lite/v3.3.0.json\", \"datasets\": {\"data-58528f5c24b12afa02602281cb716a74\": [{\"appeared\": \" <2018\", \"label\": 0, \"sha256\": 50000, \"subset\": 50000, \"avclass\": 0}, {\"appeared\": \"2018-01\", \"label\": -1, \"sha256\": 22788, \"subset\": 22788, \"avclass\": 10482}, {\"appeared\": \"2018-01\", \"label\": 0, \"sha256\": 29423, \"subset\": 29423, \"avclass\": 0}, {\"appeared\": \"2018-01\", \"label\": 1, \"sha256\": 32491, \"subset\": 32491, \"avclass\": 30723}, {\"appeared\": \"2018-02\", \"label\": -1, \"sha256\": 19319, \"subset\": 19319, \"avclass\": 9644}, {\"appeared\": \"2018-02\", \"label\": 0, \"sha256\": 22915, \"subset\": 22915, \"avclass\": 0}, {\"appeared\": \"2018-02\", \"label\": 1, \"sha256\": 31222, \"subset\": 31222, \"avclass\": 29368}, {\"appeared\": \"2018-03\", \"label\": -1, \"sha256\": 15404, \"subset\": 15404, \"avclass\": 6432}, {\"appeared\": \"2018-03\", \"label\": 0, \"sha256\": 21373, \"subset\": 21373, \"avclass\": 0}, {\"appeared\": \"2018-03\", \"label\": 1, \"sha256\": 20152, \"subset\": 20152, \"avclass\": 19080}, {\"appeared\": \"2018-04\", \"label\": -1, \"sha256\": 18880, \"subset\": 18880, \"avclass\": 8685}, {\"appeared\": \"2018-04\", \"label\": 0, \"sha256\": 25190, \"subset\": 25190, \"avclass\": 0}, {\"appeared\": \"2018-04\", \"label\": 1, \"sha256\": 26892, \"subset\": 26892, \"avclass\": 26061}, {\"appeared\": \"2018-05\", \"label\": -1, \"sha256\": 17088, \"subset\": 17088, \"avclass\": 7232}, {\"appeared\": \"2018-05\", \"label\": 0, \"sha256\": 23719, \"subset\": 23719, \"avclass\": 0}, {\"appeared\": \"2018-05\", \"label\": 1, \"sha256\": 22193, \"subset\": 22193, \"avclass\": 21530}, {\"appeared\": \"2018-06\", \"label\": -1, \"sha256\": 17794, \"subset\": 17794, \"avclass\": 8010}, {\"appeared\": \"2018-06\", \"label\": 0, \"sha256\": 23285, \"subset\": 23285, \"avclass\": 0}, {\"appeared\": \"2018-06\", \"label\": 1, \"sha256\": 25116, \"subset\": 25116, \"avclass\": 23963}, {\"appeared\": \"2018-07\", \"label\": -1, \"sha256\": 18643, \"subset\": 18643, \"avclass\": 8496}, {\"appeared\": \"2018-07\", \"label\": 0, \"sha256\": 24799, \"subset\": 24799, \"avclass\": 0}, {\"appeared\": \"2018-07\", \"label\": 1, \"sha256\": 26622, \"subset\": 26622, \"avclass\": 25880}, {\"appeared\": \"2018-08\", \"label\": -1, \"sha256\": 16693, \"subset\": 16693, \"avclass\": 6794}, {\"appeared\": \"2018-08\", \"label\": 0, \"sha256\": 23634, \"subset\": 23634, \"avclass\": 0}, {\"appeared\": \"2018-08\", \"label\": 1, \"sha256\": 21791, \"subset\": 21791, \"avclass\": 20590}, {\"appeared\": \"2018-09\", \"label\": -1, \"sha256\": 22583, \"subset\": 22583, \"avclass\": 11893}, {\"appeared\": \"2018-09\", \"label\": 0, \"sha256\": 25707, \"subset\": 25707, \"avclass\": 0}, {\"appeared\": \"2018-09\", \"label\": 1, \"sha256\": 37062, \"subset\": 37062, \"avclass\": 35708}, {\"appeared\": \"2018-10\", \"label\": -1, \"sha256\": 30808, \"subset\": 30808, \"avclass\": 18765}, {\"appeared\": \"2018-10\", \"label\": 0, \"sha256\": 29955, \"subset\": 29955, \"avclass\": 0}, {\"appeared\": \"2018-10\", \"label\": 1, \"sha256\": 56459, \"subset\": 56459, \"avclass\": 56343}, {\"appeared\": \"2018-11\", \"label\": 0, \"sha256\": 50000, \"subset\": 50000, \"avclass\": 0}, {\"appeared\": \"2018-11\", \"label\": 1, \"sha256\": 50000, \"subset\": 50000, \"avclass\": 49796}, {\"appeared\": \"2018-12\", \"label\": 0, \"sha256\": 50000, \"subset\": 50000, \"avclass\": 0}, {\"appeared\": \"2018-12\", \"label\": 1, \"sha256\": 50000, \"subset\": 50000, \"avclass\": 49525}]}};\n",
       "var opt = {};\n",
       "var type = \"vega-lite\";\n",
       "var id = \"fb0b7505-3267-4b76-99eb-23a485ae8c17\";\n",
       "\n",
       "var output_area = this;\n",
       "\n",
       "require([\"nbextensions/jupyter-vega/index\"], function(vega) {\n",
       "  var target = document.createElement(\"div\");\n",
       "  target.id = id;\n",
       "  target.className = \"vega-embed\";\n",
       "\n",
       "  var style = document.createElement(\"style\");\n",
       "  style.textContent = [\n",
       "    \".vega-embed .error p {\",\n",
       "    \"  color: firebrick;\",\n",
       "    \"  font-size: 14px;\",\n",
       "    \"}\",\n",
       "  ].join(\"\\\\n\");\n",
       "\n",
       "  // element is a jQuery wrapped DOM element inside the output area\n",
       "  // see http://ipython.readthedocs.io/en/stable/api/generated/\\\n",
       "  // IPython.display.html#IPython.display.Javascript.__init__\n",
       "  element[0].appendChild(target);\n",
       "  element[0].appendChild(style);\n",
       "\n",
       "  vega.render(\"#\" + id, spec, type, opt, output_area);\n",
       "}, function (err) {\n",
       "  if (err.requireType !== \"scripterror\") {\n",
       "    throw(err);\n",
       "  }\n",
       "});\n"
      ],
      "text/plain": [
       "<vega.vegalite.VegaLite at 0x7f6dc85ea160>"
      ]
     },
     "metadata": {
      "jupyter-vega": "#fb0b7505-3267-4b76-99eb-23a485ae8c17"
     },
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": []
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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"
     },
     "metadata": {
      "jupyter-vega": "#fb0b7505-3267-4b76-99eb-23a485ae8c17"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plotdf = emberdf.copy()\n",
    "plotdf.loc[plotdf[\"appeared\"] < \"2018-01\", \"appeared\"] = \" <2018\"\n",
    "gbdf = plotdf.groupby([\"appeared\", \"label\"]).count().reset_index()\n",
    "alt.Chart(gbdf).mark_bar().encode(\n",
    "    alt.X('appeared:O', axis=alt.Axis(title='Month appeared')),\n",
    "    alt.Y('sum(sha256):Q', axis=alt.Axis(title='Number of samples')),\n",
    "    alt.Color('label:N', scale=alt.Scale(range=[\"#00b300\", \"#3333ff\", \"#ff3333\"]), legend=alt.Legend(values=[\"unlabeled\", \"benign\", \"malicious\"]))\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_test_pred = lgbm_model.predict(X_test)\n",
    "y_train_pred = lgbm_model.predict(X_train)\n",
    "emberdf[\"y_pred\"] = np.hstack((y_train_pred, y_test_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ROC AUC: 0.9964289467999999\n",
      "\n",
      "Ember Model Performance at 1% FPR:\n",
      "Threshold: 0.8336\n",
      "False Positive Rate: 1.000%\n",
      "False Negative Rate: 3.502%\n",
      "Detection Rate: 96.498%\n",
      "\n",
      "Ember Model Performance at 0.1% FPR:\n",
      "Threshold: 0.9996\n",
      "False Positive Rate: 0.098%\n",
      "False Negative Rate: 13.192%\n",
      "Detection Rate: 86.80799999999999%\n"
     ]
    }
   ],
   "source": [
    "def get_fpr(y_true, y_pred):\n",
    "    nbenign = (y_true == 0).sum()\n",
    "    nfalse = (y_pred[y_true == 0] == 1).sum()\n",
    "    return nfalse / float(nbenign)\n",
    "\n",
    "\n",
    "def find_threshold(y_true, y_pred, fpr_target):\n",
    "    thresh = 0.0\n",
    "    fpr = get_fpr(y_true, y_pred > thresh)\n",
    "    while fpr > fpr_target and thresh < 1.0:\n",
    "        thresh += 0.0001\n",
    "        fpr = get_fpr(y_true, y_pred > thresh)\n",
    "    return thresh, fpr\n",
    "\n",
    "testdf = emberdf[emberdf[\"subset\"] == \"test\"]\n",
    "print(\"ROC AUC:\", roc_auc_score(testdf.label, testdf.y_pred))\n",
    "print()\n",
    "\n",
    "threshold, fpr = find_threshold(testdf.label, testdf.y_pred, 0.01)\n",
    "fnr = (testdf.y_pred[testdf.label == 1] < threshold).sum() / float((testdf.label == 1).sum())\n",
    "print(\"Ember Model Performance at 1% FPR:\")\n",
    "print(\"Threshold: {:.4f}\".format(threshold))\n",
    "print(\"False Positive Rate: {:.3f}%\".format(fpr * 100))\n",
    "print(\"False Negative Rate: {:.3f}%\".format(fnr * 100))\n",
    "print(\"Detection Rate: {}%\".format(100 - fnr * 100))\n",
    "print()\n",
    "\n",
    "threshold, fpr = find_threshold(testdf.label, testdf.y_pred, 0.001)\n",
    "fnr = (testdf.y_pred[testdf.label == 1] < threshold).sum() / float((testdf.label == 1).sum())\n",
    "print(\"Ember Model Performance at 0.1% FPR:\")\n",
    "print(\"Threshold: {:.4f}\".format(threshold))\n",
    "print(\"False Positive Rate: {:.3f}%\".format(fpr * 100))\n",
    "print(\"False Negative Rate: {:.3f}%\".format(fnr * 100))\n",
    "print(\"Detection Rate: {}%\".format(100 - fnr * 100))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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WmnPPfdUeXm5vv/97+u73/2u2rVrp/bt26tRo0Z18rrZEubZAWfV0O+Sfpamb5wSRQIAIA/MmzdPV199tcaNq/lX+7Jly7KQSOrXr5/atm2rrl27qnfv3lq7dq26dOmiVq1aqUGDBtpzzz3VqlUrNW3aNCt5ohDl7gAAQB7btGmTXnrpJX399de68sorI81SUFCgRo0aaePGjRo6dKguv/xyHXHEEZFmygUUAQCAOvPNN9/o3nvv1U033VRn2ywoKFB5ebkOOOAA7bXXXmrRooXatGmjFi1aaLfddlOjRo206667yt21ZMkS9enTR5s3b1anTp3UqVMnNW/eXM2bN1fDhnzkVca/CABgp5SUlGjo0KF6++23a73utlPxzjnnHLVu3Vq77767GjdurEaNGukHP/iBOnfurJYtW4aQGhJFAABgB02dOlVPPvmk7rvvvlqtd9ddd+n8889XYWGhzFJdGgbZQhEAAKiVDz/8UIcffri2bt2a8TqHHXaYBg0apMsuu0zf+c53QkyH2qAIAABUq6KiQjNmzNCUKVP061//Wt98802N6/zP//yPdt99d916661q3rx5FlJiR1AEAAC+tWrVKn366af64IMPtGXLFt1www0Zr9u2bVu99dZb6tmzZ4gJUZcoAgAgZioqKrRgwQLNnDlTkyZNUmlpqR5++OFvL4pTW7/4xS907bXXqkOHDnWcFGGjCACAPLdx40bdcMMNev/997V27VotWLCgTra777776tlnn1Xv3r3rZHvIPooAAMhjs2bN0oEHHlhn27vhhhvUqVMnDRo0SF26dOHo/nqOIgAA8sTSpUs1ZcoULV26VG+99ZYWLFigyZMn13o7TZs21YYNG9SmTRv96Ec/0qmnnqpddtlFQ4YMCSE1okQRAAD1hLurpKRES5Ys0fLly/XZZ59p8uTJev7559WsWTOtWrUq4221bNlSLVq0UHFxsXr16qUBAwbo7LPPVrdu3VJeWa+oqKgO/ybIFRQBAJCDKioqNGvWLL377rtatGiRHn30UZWVlam0tDTl8ps3b85ouyeeeKIeeugh7bHHHkzlgyIAAHLJxo0bdf3119f6KnyZuPPOO3XjjTfW+XZRf1EEAEAOKCkp0cEHH6zly5fv1HZ69Oih+fPn68orr1T37t3Vpk0bHXHEEdpjjz3qKCnyCUUAAETkww8/1H333ae3335bCxcurNW6ffv21d57762ePXuqW7du2meffdS9e3ftsssuIaVFPqIIAIAs2LRpkyZPnqz33ntPM2bM0JtvvqmVK1dmtO4+++yjfffdV8OGDdPJJ5+sgoKCkNMiLigCACAEmzZt0h//+EfdfvvtO7yNjz76qE7P8QcqowgAgDqwdetWjR8/Xq+88oo+/PBDvf/++7XeRosWLbR+/XrNmjVL3/ve90JICWyPIgAAamnDhg16/fXX9dxzz2n69Olq0KCBPvnkkx3a1t57760ePXroscceU7t27eo4KVA9igAAyNBdd92lX//619q0adMOb6OwsFD777+/rrjiCg0aNEgtWrSow4RA7VAEAEAaFRUVGjdunObPn68HHnhAn332Wa230bt3b5155pk64ogj1K9fPy7Qg5xCEQAAlVRUVGjUqFG65pprarVe+/bt1atXL3Xr1k0DBw7Ucccdxyl7yGkUAQAgqby8XBMnTtTf//53/eUvf8lonb322kunnnqqunXrplNOOYVL8aLeoQgAEFuff/65nn/+eU2ZMkVvvPGG1q5dW+M63/nOd3T44YfrH//4Bx/4qPcoAgDExubNm/XnP/9Z7733nqZPn64vv/wyo/V69Oih5s2ba8SIEerXr58aNGgQclIgOygCAOS1zz//XK+99pruuOMOffXVV7Va95RTTtENN9ygww8/PKR0QLQoAgDknRUrVuiaa67RU089Vav1mjdvrhNOOEEnnXSSTj31VDVr1iykhEBuoAgAkDdKS0t19NFHa8aMGRmvc+SRR6pVq1YaOnSozjjjDDVq1CjEhEBuoQgAUO9t3LhR99xzj2655ZaMlv/BD36gM888U+eff74aN24ccjogd1EEAKiXVq5cqaefflqPP/54Rt/8f/azn+m0007Tsccey1H9QIAiAEC9Mnv2bJ100kn6/PPPM1p+7ty56tatW7ihgHqK81wA1AuzZs2Smalnz541FgDDhg3TkiVL5O4UAEA1KAIA5LR3331Xu+22mw488MAal7344ov15Zdf6sEHH1RhYWEW0gH1G7sDAOSkqVOn6oc//KGWLVtW7XLnn3++TjjhBJ122mlq2JBfaUBt8I4BkDNWrFihUaNG6Xe/+12Ny55++ul6+umnteuuu2YhGZCfKAIARO7NN9/U8ccfn9Gyt912m2699VbuzgfUAYoA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\n",
      "text/plain": [
       "<Figure size 576x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8, 8))\n",
    "fpr_plot, tpr_plot, _ = roc_curve(testdf.label, testdf.y_pred)\n",
    "plt.plot(fpr_plot, tpr_plot, lw=4, color='k')\n",
    "plt.gca().set_xscale(\"log\")\n",
    "plt.yticks(np.arange(22) / 20.0)\n",
    "plt.xlim([4e-5, 1.0])\n",
    "plt.ylim([0.65, 1.01])\n",
    "plt.gca().grid(True)\n",
    "plt.vlines(fpr, 0, 1 - fnr, color=\"r\", lw=2)\n",
    "plt.hlines(1 - fnr, 0, fpr, color=\"r\", lw=2)\n",
    "plt.xlabel(\"False positive rate\")\n",
    "plt.ylabel(\"True positive rate\")\n",
    "_ = plt.title(\"Ember Model ROC Curve\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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rZUMdA9nAYC1VjLQAYC1BDoADECgA8AABDoADECgA8AABDoADODQZRfAWM46a9kV7Nm55y67AoADzwgdAAYg0AFgAAIdAAYg0AFgAAIdAAYg0AFgAAIdAAYg0AFgAAIdAAawkjPFVdUZSc446aSTll0KwL5ZhWkVWSkrOULv7gu7e9uWLVuWXQoAbAorGegAwFoCHQAGINABYAACHQAGsJJXucP+WIWLiz2zHdhbRugAMACBDgADcModgJ26+qPLroC9YYQOAAMwQodNaLNfuOeiPdh8jNABYAACHQAGINABYAC+QwfGtNkvRIADzAgdAAYg0AFgAAIdAAYg0AFgAC6KA1gC06pyoBmhA8AABDoADMAp9xXzoo9u7ntrX3iiSb4BlmElR+hVdUZVbd+xY8eySwGATWElR+jdfWGSC7du3fqsZdcCbE4uOuNgs5IjdABgrZUcobN5bfbv+BPf8wNjEujAXluF5568aNkFwAZzyh0ABiDQAWAAAh0ABiDQAWAALorjoONKfGBERugAMACBDgADEOgAMACBDgADEOgAMACBDgADEOgAMACBDgADEOgAMACBDgADMPUrsNdWYfpcONgYoQPAAAQ6AAzAKXfYhJzSBvaWEToADECgA8AABDoADECgA8AABDoADECgA8AABDoADECgA8AABDoADECgA8AABDoADECgA8AABDoADECgA8AANlWgV9X3VtXvVNWfVNWjl10PAKyKhQd6Vb26qm6oqg+uaz+9qj5cVVdV1fOTpLv/uLufleQZSZ686NoAYBQbMUI/J8npsw1VdUiSVyR5TJJTk5xZVafOrPKC6XIAYA4LD/TuviTJzeuaH5Tkqu6+uru/mOS8JI+viV9L8ufd/beLrg0ARrGs79DvnuTamffXTdt+Ksmjkjyxqp69sw2raltVXV5Vl994442LrxQAVsChSzpu7aStu/tlSV62uw27e3uS7UlSVTdW1TUHsK6jktx0APd3MNKHB4Z+3H/6cP/pw/1Vv3+g+/Aeu1qwrEC/LslxM++PTXL93u6ku48+YBUlqarLu3vrgdznwUYfHhj6cf/pw/2nD/ffRvbhsk65X5bk5Ko6saoOS/KUJBcsqRYAWHkbcdva65NcmuSUqrquqp7Z3bckeU6SNyf5UJLzu/vKRdcCAKNa+Cn37j5zF+0XJblo0cffS9uXXcAA9OGBoR/3nz7cf/pw/21YH1Z3b9SxAIAF2VRTvwIA++agDPSdTTu7bnlV1cumy99fVQ9YRp2b2Rx9+NRp372/qt5dVfdfRp2b2Z76cGa9B1bVrVX1xI2sbxXM04dV9bCq+ruqurKq3rHRNa6COf49b6mqC6vqfdN+/OFl1LlZ7WqK85nlG5Mp3X1QvZIckuSfktwzyWFJ3pfk1HXrPDbJn2dyv/y3J/nrZde9mV5z9uGDk9x5+vNj9OHe9+HMem/P5HqTJy677s30mvPv4ZFJ/j7J8dP3d1l23ZvtNWc//lySX5v+fHQms38etuzaN8sryUOTPCDJB3exfEMy5WAcoe902tl16zw+yWt64j1Jjqyqu250oZvYHvuwu9/d3Z+cvn1PJnMN8BXz/D1MJrMn/mGSGzayuBUxTx/+YJI3dfe/JEl368evNk8/dpI7VVUlOSKTQL9lY8vcvHrnU5zP2pBMORgDfVfTzu7tOgezve2fZ2by2ylfscc+rKq7J/m+JGdvYF2rZJ6/h/dOcuequriqrqiqp29Ydatjnn58eZL7ZjIB2AeS/HR3f2ljyhvChmTKsmaKW6adTju7D+sczObun6p6eCaB/pCFVrR65unDlyZ5XnffOhkYsc48fXhokm9L8sgkd0xyaVW9p7s/sujiVsg8/fhdSf4uySOS3CvJW6vqnd396UUXN4gNyZSDMdDnmXb2gExNO7C5+qeqvjnJq5I8prs/sUG1rYp5+nBrkvOmYX5UksdW1S3d/ccbU+KmN++/5Zu6+3NJPldVlyS5fxKB/hXz9OMPJ3lxT74QvqqqPprkPkn+ZmNKXHkbkikH4yn3eaadvSDJ06dXJn57kh3d/bGNLnQT22MfVtXxSd6U5CyjoZ3aYx9294ndfUJ3n5DkjUl+QpivMc+/5T9J8p+r6tCq+k9JTstkdkq+Yp5+/JdMznKkqo5JckqSqze0ytW2IZly0I3Qu/uWqrpt2tlDkry6u6+87XGt3X12JlcUPzbJVUn+LZPfTpmasw9/McnXJ3nldIR5S3vIw5fN2Yfsxjx92N0fqqq/SPL+JF9K8qru3umtRQerOf8u/lKSc6rqA5mcPn5ed3sK29R0ivOHJTmqqq5L8sIkt082NlPMFAcAAzgYT7kDwHAEOgAMQKADwAAEOgAMQKADwAAEOpCq+vnpU7TeP30y2WnLrgnYOwfdfejAWlX1HUkel+QB3f2Fqjoqk6du7ev+Du1uD+6ADWaEDtw1k+lRv5Ak3X1Td18/fQ77u6fPwP6bqrpTVR1eVb9bVR+oqvdO5+pPVT2jqt5QVRcmecu07blVddl01P+i5X08ODgYoQNvSfKLVfWRJG9L8gdJLp3+98ndfVlVfW2Szyf56STp7m+qqvskeUtV3Xu6n+9I8s3dfXNVPTrJyZk8mrOSXFBVD50+ZhJYACN0OMh192czeSLZtiQ3ZhLkP5bkY9192XSdT09Poz8kybnTtn9Ick0mjyhNkrd2923PhH709PXeJH+byYM8Tt6QDwQHKSN0IN19a5KLk1w8na/7J7Pzxzvu7jmun1u33q92928fsCKB3TJCh4NcVZ1SVbOj52/J5Ilkd6uqB07XuVNVHZrkkiRPnbbdO8nxST68k92+OcmPVNUR03XvXlV3WeDHgIOeETpwRJLfrKojk9ySyROhtiX53Wn7HTP5/vxRSV6Z5OzpKP6WJM+YXhm/Zofd/Zaqum+SS6fLPpvkaUlu2JiPBAcfT1sDgAE45Q4AAxDoADAAgQ4AAxDoADAAgQ4AAxDoADAAgQ4AAxDoADCA/w+RjnbE/qeswgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 576x576 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig = plt.figure(figsize=(8, 8))\n",
    "testdf[testdf[\"label\"] == 0].y_pred.hist(range=[0, 1], bins=10, color=\"#3333ff\", alpha=0.8, label=\"benign\")\n",
    "testdf[testdf[\"label\"] == 1].y_pred.hist(range=[0, 1], bins=10, color=\"#ff3333\", alpha=0.8, label=\"malicious\")\n",
    "plt.gca().set_yscale(\"log\", nonposy=\"clip\")\n",
    "plt.gca().grid(False)\n",
    "plt.xlabel(\"Score\")\n",
    "plt.ylabel(\"Count\")\n",
    "_ = plt.title(\"Ember Test Set Model Score\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
